package cn.agiledata.bank.common.service;

import java.util.Date;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

import cn.agiledata.bank.common.servlet.InitForString;
import cn.agiledata.bank.common.util.DateUtil;
import cn.agiledata.bank.hibernateBean.Sysbook;

/**
 * 获取全局参数 
 * 马贤波
 * 2007-02-02
 */
public final class NotifyUtil {

	final static Logger log = Logger.getLogger(NotifyUtil.class);

	/**
	 * 获取某状态的交易提醒前的天数<br/>
	 * =getTranPermitDays(transStatus)-getTranNotifyDays(transStatus)
	 * 
	 * @param transStatus
	 *            使用cn.agiledata.bank.common.util.Constant#TRANS_STATUS_WAITFORBUYER
	 *            cn.agiledata.bank.common.util.Constant#TRANS_STATUS_WAITFORBUYERAFFIRM
	 *            cn.agiledata.bank.common.util.Constant#TRANS_STATUS_APPLYREFUND
	 * @return 交易提醒前的天数
	 * @throws Exception
	 *             该transStatus未配置 或不存在
	 */
	public static int getTranBeforeNotifyDays(String transStatus)
			throws Exception {
		return getTranPermitDays(transStatus) - getTranNotifyDays(transStatus);
	}

	/**
	 * 获取某状态的交易允许处理的天数
	 * 
	 * @param transStatus
	 *            使用cn.agiledata.bank.common.util.Constant#TRANS_STATUS_WAITFORBUYER
	 *            cn.agiledata.bank.common.util.Constant#TRANS_STATUS_WAITFORBUYERAFFIRM
	 *            cn.agiledata.bank.common.util.Constant#TRANS_STATUS_APPLYREFUND
	 * @return 允许处理的天数
	 * @throws Exception
	 *             该transStatus未配置 或不存在
	 */
	public static int getTranPermitDays(String transStatus) throws Exception {
		// if(permitDaysMap==null){
		// __initPermitDaysMap();
		// }
		return getValue(transStatus, permitDaysMap);
	}

	/**
	 * 获取某状态的交易提前提醒的天数
	 * 
	 * @param transStatus
	 *            使用cn.agiledata.bank.common.util.Constant#TRANS_STATUS_WAITFORBUYER
	 *            cn.agiledata.bank.common.util.Constant#TRANS_STATUS_WAITFORBUYERAFFIRM
	 *            cn.agiledata.bank.common.util.Constant#TRANS_STATUS_APPLYREFUND
	 * @return 提前提醒的天数
	 * @throws Exception
	 *             该transStatus未配置 或不存在
	 */
	public static int getTranNotifyDays(String transStatus) throws Exception {
		// if(notifyDaysMap==null){
		// __initNotifyDaysMap();
		// }
		return getValue(transStatus, notifyDaysMap);
	}

	private static int getValue(String transStatus, Map map) throws Exception {
		if (transStatus != null) {
			Object obj = map.get(transStatus);
			if (obj != null) {
				try {
					return ((Integer) obj).intValue();
				} catch (Exception e) {
					// TODO: handle exception
					log.info("getValue:" + e);
				}
			}
		}

		throw new Exception("not find the transaction status :" + transStatus);

	}

	/**
	 * 获取该交易可供处理的剩余时间
	 * 
	 * @param begin
	 *            交易的开始时间
	 * @param transStatus
	 *            交易状态
	 * @return 见cn.agiledata.bank.common.util.DateUtil#naturalDHMBetween
	 */
	public static int[] getPermissionLeftDHM(Date begin, String transStatus) {
		Date endDate = null;
		try {
			//endDate = new Date(begin.getTime() + getTranPermitDays(transStatus)
			//		* 24L * 3600 * 1000);
			endDate = new Date(begin.getTime() + getTranPermitDays(transStatus)
					*60L * 1000);

		} catch (Exception e) {
			log.info("getPermissionLeftDHM:" + e);
		}

		int[] leftTime = DateUtil.naturalDHMBetween(new Date(), endDate);

		return leftTime;
	}

	/**
	 * 获取该交易可供处理的剩余时间
	 * 
	 * @param begin
	 *            交易的开始时间
	 * @param transStatus
	 *            交易状态
	 * @return 见@see cn.agiledata.bank.common.util.DateUtil#naturalDHMBetween
	 */
	public static Date getPermitedEndDate(Date begin, String transStatus) {
		try {
			return new Date(begin.getTime() + getTranPermitDays(transStatus)
					*60 * 1000L);
		} catch (Exception e) {
			log.info("getPermitedEndDate:" + e);
		}
		return null;
	}

	/***************************************************************************
	 * 交易处理允许天数，到期不处理将超时
	 **************************************************************************/
	public static final String PERMIT_DAYS_OF_TRANSACTION = "PERMIT_DAYS_OF_TRANSACTION";

	/***************************************************************************
	 * 开始通知，即提前NOTIFY_DAYS天开始提醒，比如发邮件
	 **************************************************************************/
	public static final String NOTIFY_DAYS_OF_TRANSACTION = "NOTIFY_DAYS_OF_TRANSACTION";

	/***************************************************************************
	 * 简单私有方法，List->Map，从环境中装载数据
	 **************************************************************************/
	private static void _initMap(final List list, Map map) {
		for (int i = 0; i < list.size(); i++) {
			Sysbook sysbook = (Sysbook) list.get(i);
			try {
				log.debug("id(transaction status)="
						+ sysbook.getId().getListId() + ",typeName="
						+ sysbook.getTypeName() + ",listName="
						+ sysbook.getListName());
				map.put(sysbook.getId().getListId(), new Integer(sysbook
						.getListName()));
			} catch (NumberFormatException e) {
				log.info("init data of " + sysbook.getId().getListId() + " "
						+ sysbook.getListName() + " :" + e);
			}
		}
	}

	/***************************************************************************
	 * 允许的天数
	 **************************************************************************/
	private static Map permitDaysMap = null;
	static {
		permitDaysMap = new Hashtable();
		final List list = InitForString.getTypeList(PERMIT_DAYS_OF_TRANSACTION);
		log.debug("init " + PERMIT_DAYS_OF_TRANSACTION + "'s data ...");
		_initMap(list, permitDaysMap);
	}

	/***************************************************************************
	 * 提前几天提醒
	 **************************************************************************/
	private static Map notifyDaysMap = null;
	static {
		notifyDaysMap = new Hashtable();
		final List list = InitForString.getTypeList(NOTIFY_DAYS_OF_TRANSACTION);
		log.debug("init " + NOTIFY_DAYS_OF_TRANSACTION + "'s data ...");
		_initMap(list, notifyDaysMap);
	}

}
